import { ref, onMounted, onUnmounted } from 'vue'

/**
 * 自定义Hook用于处理定时任务
 * @param callback - 定时执行的回调函数
 * @param delay - 延迟时间（毫秒）
 * @param immediate - 是否立即触发
 * @returns 一个函数用来清除定时器
 */
function useInterval(callback: () => void, delay: number, immediate = true) {
  const savedCallback = ref<() => void>(() => {})

  // 使用ref存储最新的callback以解决闭包问题
  onMounted(() => {
    savedCallback.value = callback
  })

  let timeoutId: ReturnType<typeof setTimeout> | null = null

  const tick = () => {
    savedCallback.value()
    timeoutId = setTimeout(tick, delay)
  }

  // 启动定时器
  onMounted(() => {
    if (immediate) tick()
    else timeoutId = setTimeout(tick, delay)
  })

  // 清除定时器
  onUnmounted(() => {
    if (timeoutId !== null) {
      clearTimeout(timeoutId)
    }
  })

  // 返回清除函数
  return () => {
    if (timeoutId !== null) {
      clearTimeout(timeoutId)
    }
  }
}

export default useInterval
